// 绑定是为了确定在函数调用时调用的是哪个函数的代码
// 动态绑定（运行时确定选择哪个函数）和静态绑定（在编译时就确定下来了）-----虚函数
// 友元函数不能为虚函数，友元函数的存在就是为了给子类去实现的
// 析构函数应该是虚函数，除非没有基类
// protected修饰的成员函数，子类可以对其进行访问，但类外无法进行访问
// 子类构造函数执行前会先调用弗雷的构造函数
// 子类析构函数调用之后会调用父类的析构函数
// 纯虚函数 virtual void print() = 0; 
// 析构函数一定是虚函数
#include <iostream>
class Base{
public:
    virtual void printMs(){
        std::cout<<"Base"<<std::endl;
    }
};
class BasePlus: public Base{
public:
    virtual void printMs() override final{     // final表示派生的类无法对其进行重写
        std::cout<<"BasePlus"<<std::endl;
    }
};
void printMs(Base *b){           // 实现多态，通过基类访问派生类函数
    b->printMs();
}
int main()
{
    using namespace std;
    Base b;
    BasePlus bp;
    Base* p = &bp;
    Base* q = new BasePlus();
    printMs(p);
    p = &b;
    printMs(p);
    printMs(q);
    
    return 0;
}
// suggestions to project
// 1. 使用size_int（无符号整数）替代int
// 2. 使用memcpy()函数来拷贝数据
// 3. 使用1维数组而不是二维数组表示矩阵
// 4。在函数体中一定先进行参数检查
// 5. 文件名建议使用小写字母
